/*
 * Vinicius Mendes Kastrup Magalhães	-	110092513
 * Thales Teixeira Pires				-	110092474
 */

package main;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


public class Controle {
	
	private AutomatoFinitoDeterministico afd;
	
	public Controle() {}
	
	public void inicializaAutomato() {
		afd = new AutomatoFinitoDeterministico();
	}
	
	public void addSimbolo(String s) {
		afd.addSimbolo(s);
	}
	
	public void addEstado(String e) {
		afd.addEstado(e);
	}
	
	public void setEstadoFinal(String e) {
		afd.setEstadoFinal(e);
	}
	
	public void setEstadoInicial(String e) {
		afd.setEstadoInicial(e);
	}
		
	public void addTransicao(String ea, String s, String ep) {
		afd.addTransicao(ea,s,ep);
	}
	
	public boolean aceita(String s) {
		return afd.aceita(s);
	}
	
	public int numeroTransicoes() {
		return afd.getEstados().size()*afd.getAlfabeto().size();
	}
	
	public String brzozowski() {
		Brzozowski br = new Brzozowski(afd);
		return br.brzozowski();
	}
	
	public String kleene() {
		Kleene kl = new Kleene(afd);
		return kl.expressaoRegular();
	}
	
	public boolean lerArquivo(String caminho) {
		try {
	        BufferedReader in = new BufferedReader(new FileReader(caminho));
	        ArrayList<String> lines = new ArrayList<String>();
	        while (in.ready()) lines.add(in.readLine());
            in.close();
            return process(lines);
	    } catch (IOException e) {
	    	System.out.println("Erro na leitura.");
			return false;
	    }
	}

	//metodo para ler de um arquivo
	private boolean process(ArrayList<String> lines) {
		try {
			int size,i;
			String regex = " +";
			String[] transicao;
			String[] simbolos = lines.get(0).trim().split(regex);
			String[] estados = lines.get(1).trim().split(regex);
			String[] finais = lines.get(2).trim().split(regex);
			String inicial = lines.get(3).trim();
			if (lines.size() != 4 + simbolos.length * estados.length) {
				System.out.println("Erro na padrao de entrada.");
				return false;
			}
			inicializaAutomato();
			size = simbolos.length;
			for (i=0; i<size; i++) addSimbolo(simbolos[i]);
			size = estados.length;
			for (i=0; i<size; i++) addEstado(estados[i]);
			size = finais.length;
			for (i=0; i<size; i++) setEstadoFinal(finais[i]);
			setEstadoInicial(inicial);
			for (i=4; i<lines.size();i++) {
				transicao = lines.get(i).trim().split(regex);
				if (transicao.length != 3) {
					System.out.println("Erro na padrao de entrada.");
					return false;
				}
				addTransicao(transicao[0],transicao[1],transicao[2]);
			}
			return true;
		} catch (NullPointerException e) {
			System.out.println("c");
			return false;
		} catch (IndexOutOfBoundsException e) {
			System.out.println("d");
			return false;
		}
	}
	
}